<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>
	<script type="text/javascript">
		/*
			作用域:代码或变量可以使用的范围。
			局部作用域(函数作用域)： 函数内部就是局部作用域
			全局作用域：整个script标签或者单独的js文件(在window中)
						函数外部用var声明的变量是全局作用域
						不用let或var声明的变量，视为全局变量

		*/
		// 全局变量
		var a = 100;
		console.log(window)
		function fn(){
			// 在函数内部的变量是局部变量，只能在函数内部用
			// var a = 10
			console.log(a)
			// 在函数内部不用let或var声明的变量，视为全局变量
			c = 20
		}
		fn()
		console.log(a)//100
		console.log(c)



		function f2(){
			var z = b = c = 10;
			// 想当于
			// var z = 10;
			// b = 10
			// c = 10
		}
		// f2()
		// // console.log("f2--",z)//报错
		// console.log("f2--",b)//10
		// console.log("f2--",c)//10

		// // =========================
		// function f3(){
		// 	var a = 10000;
		// 	function f4(){
		// 		console.log(a)//10000
		// 	}
		// 	f4()
		// }
		// f3()
		// 2.作用域链：如果在局部作用域中使用变量时，他会从函数本身的作用域找这个变量。如果没有，就往上一层找，直到全局作用域，这个方式就是作用域链

		var e = 2;
		function fun(){
			 var e = 4;
			 function fchild(){
			 	var e = 5;
			 	console.log("e---", e)//

			 }
			 fchild()
		}

		fun()
		// ====================
		var n1 = 10;
		var n2 = 20;
		function fn2(){
			// 形参n1接受到传来的值10
			console.log(n1)//10 形参n1
			n1 += 5;//n1指的是形参n1
			console.log(n1)//15
			var n2 = 200
			console.log(n2)//200
		}

		fn2(n1)
		console.log(n1)//15
		console.log(n2)//20

		// js预解析 过程： 把声明的变量和函数进行提升
		// 变量的提升： 将变量的声明提升到当前作用域最上方， 但是赋值不提升，留在原地
		// console.log(m1)//undefined
		// var m1 = 1;

		// // =====>
		// var m1;
		// console.log(m1)//undefined
		// m1 = 1

		// var game ="火影忍者"
		// function f() {
		// 	console.log(game)//undefined
		// 	var game = "订花送花"
		// 	console.log(game)
		// }

		// f()

		//相当于
		// var game;
		// game = "火影忍者"
		// function f(){
		// 	var game;
		// 	console.log(game)//undefined
		// 	game = "订花送花"
		// 	console.log(game)
		// }
		// f()

		// ================================
		var name = "火影"
		function f2(name){
			console.log(name)//火影
			var name = "柯南"
			console.log(name)//柯南
		}
		f2(name)

		// 相当于
		// var game;
		// game = "火影"
		// function f(name){
		// 在函数内部, 参数名name已存在, var name就会被忽略掉
		// 	var game;
		// 	console.log(game)//火影
		// 	game = "柯南"
		// 	console.log(game)//柯南
		// }
		// f(name)
	</script>
</body>
</html>